# dict{}    set()
from stringprep import b1_set

from platformdirs import site_runtime_dir

from lxf_jack.Python_learning.python.base_01.Str_Ways import password

d = {'Michael':95,'Bob':75,'Tracy':85}   # dict{}
print(d['Michael'])
d['Bob']=60     # 新的值替换旧值
print(d)

print('Tom' in d)   #通过 in  判断元素是否在字典中
print(d.get('Tracy'))   #通过get()方法获取value

# set()
s = {1,2,3,4}
s.add(6)    #  add()   添加元素到集合
s.remove(1)  #remove()  移除元素

# 直接赋值创建字典  变量名 = {键1：值1,键2:值2,键3:值3}

stu_info_1= {'num':2018010,'name':'Liming','sex':'male'}    # 通过直接赋值创建字典

stu_info_2=dict(stu_info_1)       # 通过其他字典创建
stu_info_3=dict([('num','20180101'),('name','Liming'),('sex','male')])   # 通过'(键，值)'对的序列创建
stu_info_4=dict(numbers='20180101',name='Liming',sex='male') # 通过关键字参数创建
stu_info_5=dict(zip(['num','name','sex'],['20180101','Liming','male']))   # 通过dict 和 zip  结合创建
if stu_info_1 == stu_info_2 == stu_info_3 == stu_info_4 == stu_info_5 :            # 判断创建字典的方式是否相同
    print('创建字典的5种方式相同')            # 输出提示符
else:
    print('创建字典的5种方式不同')

#   fromkeys()创建字典      dict.fromkeys(seq,[,value]) seq 为字典的‘键’值列表，value为设置键序列seq的值
stu_age_1 = dict.fromkeys(['Wang wu','Zhang san'])  # 创建字典，'键'值默认为None
print(stu_age_1)      # 输出stu_age_1
stu_age_2 = dict.fromkeys(['Wang wu','Zhang san'],'18')   # 创建字典，'键‘ 值默认为18
print(stu_age_2)       # 输出stu_age_2

# 字典的访问  键值访问    get()方法
stu_info = {'num':'20180105','name':'Yin bing','sex' : 'male'}   # 创建字典
stu_info['num']      # 根据num访问学号
# stu_info['age']       # 抛出异常，不存在的键

# get()  方法  dict.get(key[,default = None])
stu_info.get('name')     # get()获取学生姓名
stu_info.get('age')      # get()获取学生年龄，返回None

# 字典 修改和添加元素
stu_info_1={'num':'20180105','name':'Yin bing','age':17}   # 创建字典
stu_info_1['age']  = '18'            # 修改age的值
print(stu_info_1)         # 输出修改后的值
stu_info_1['sex'] = 'male'      #  添加学生性别
print(stu_info_1)     # 输出添加后的字典

# 删除元素 del clear()  pop()  popitem()

stu_info = {'num':'20180105','name':'Yin bing','age':'18'}     # 创建字典
del stu_info['age']       # 删除age及其值

stu_info_1={'num':'222222','name':'xiao xiao','age':'19'}    # 创建字典
stu_info_1.clear()        # 清空字典
print(stu_info_1.clear())


stu_info_2={'num':'20180105','name':'Yin bing','age':'17'} # 创建字典
stu_info_2.pop('age')        # 返回并删除 age '键-值'
stu_info_2.pop('age',18)   # 无指定键，返回默认值18

# popitem()方法
stu_info = {'num':'20180105','name':'Ying bing','age':'17'}    # 创建字典
stu_info.popitem()       # 随机返回键值对并删除

# update 更新字典
stu_info={'num':"20180105",'name':'Ying bing','age':'17'}    # 创建字典
stu_info.update({'age':'18','sex':'male'})   # 修改age的值，同时添加新元素

# 复制字典  copy
stu_info={'num':'20180911','name':'Ying nin','age':121}
print(stu_info.copy())

dict_1={'user':'run oob','num':[1,2,3]}
dict2=dict_1   # 引用对象
dict_3 = dict_1.copy()   # 浅复制   ，复制父对象，子对象不复制，引用
import copy
dict_4 = copy.deepcopy(dict_1)     # 深复制，完全复制父对象和子对象
dict_1['user']   = 'root'    # 将dict_1中键为'user'的值改为'root'
dict_1[ 'num'].remove(1)    #  移除dict_1中键为'num'的列表值1

# 输出结果
print('dict_1=',dict_1)
print('dict_2=',dict2)
print('dict_3:',dict_3)
print('dict_4:',dict_4)

# 字典遍历
stu_class ={
    'Mary':'C',
    'Jon':'java',
    'Lily':'python',
    'Tony':'Python'

}
for name ,cla in stu_class.items():     # 定义字典并赋值
    print(name,'选修的是',cla)           # 输出每个值

# 遍历字典中的所有键
stu_class ={
    'Mary':'C',
    'Joe':'Java',
    'Lily':'Python',
    'Tony':'Python'
}                        # 定义字典并赋值

for name in stu_class.keys ():   # 遍历字典所有的键
    print(name)       # 输出每个键

# 遍历字典中所有的值   dict.values()
stu_class = {
    'Mary':'C',
    'Jon': 'Java',
    'Lily':'Python',
    'Tony':'Python'
}         # 定义字典并赋值
print('以下课程已被选择:')
for cla in stu_class.values():     # 遍历字典所有的值
    print(cla)        # 输出每个值

# 嵌套
student_info_1={'name':'Wang mi','sex':'F','age':'12'}       # 定义字典student_info_1并赋值
student_info_2={'name':'Lin mei','sex':'M','age':'11'}       # 定义字典student_info_2并赋值
student_info_3={'name':'Chen hui','sex':'F','age':'13'}      # 定义字典student_info_3并赋值
student = [student_info_1,student_info_2,student_info_3]     # 创建包含三个学生的列表
for s in student:           # 遍历列表
    print(s)


stu_class ={
    'Mary':['C','Math'],
    'Joe':['Java','Art'],
    'Lily':['Python'],
    'Tony':['Python','Mysql','Math']
}        # 定义字典并赋值，字典中的值为列表
for name,cla in stu_class.items():     # 遍历字典中所有的元素
    print(name,'选的课程是:')            # 输出键
    for c in cla:                       #  遍历列表
        print(c)                       # 输出列表中的值

# 字典中嵌套字典
stu_info = {
    'Wang Mi':{'sex':'F','age':'15'},
    'Lin Mei':{'sex':'M','age':'12'},
    'Chen Hui':{'sex':'F','age':'13'}
}
for name,stu in stu_info.items():          #遍历字典所有元素
    print(name,'性别',stu['sex'],'年龄',stu['age'])

# 集合的创建
a_set={1,2,3,4}     # 集合的创建
print(a_set)        # 输出集合
b1_set={2,1,3,4,1,2}    # 创建集合并赋值
print(b1_set)      #    输出集合

x = set('run oob')    # 将字符串转换为集合
y = set(['g','o','0','g','i','e'])  # 将列表转换为集合
z=set()     # 空集合

# 集合去除重复

stu_class={
    'Mary':'c',
    'joe':'java',
    'lily':'python',
    'tony':'python'
}      # 定义字典并赋值
print('下面的课程已被选择:')
for cla in set(stu_class.values()):    # 遍历字典所有的值，调用set()将列表转化为集合去除重复项
    print(cla)       # 输出每个值

# 集合基本操作
s= (1,2,3)     # 创建集合并赋值
s.add(4)       # 添加元素
s.update({5,4,6})  # 更新当前集合
s.disscard(5)    # 输出元素
s.remove(5)      # 删除元素，不存在抛出异常
s.pop()         # 删除并返回一个元素

a_set = {1,2,3,4,5}   # 创建集合并赋值
b1_set={1,2,6,7,8}    # 创建集合并赋值

a_set  &  b1_set  # 交集
a_set|b1_set      # 并集
a_set-b1_set      # 差集
a_set^b1_set      # 补集

# 登录验证
count = 0     # 定义变量count 变量 并赋初值为0
password =123   # 定义password 变量并赋初值为123
dict_1={
    'alex':[password,count],'Tom':[password,count]             # 定义字典存储用户信息
}
while True:     # 开始循环
    name=input('please input your name:')            # 输入用户名
    password =int(input('please input your password:'))  # 输入密码
    if name not in dict_1.keys():      # 如果输入的用户名不在字典中
        print('name%s is not in dict'%name)    #  输出提示语
        break                                   # 跳出循环
    if dict_1[name][1] >2:   # 如果次数大于2
        print('the name %s locked'%name)      # 输出被锁定提示
        break
    if password == dict_1[name][0]:    # 如果输入的密码正确
        print('login ok')              # 输出登录成功语
        break
    else:
        print('name or password error')    # 输出提示语
        dict_1[name][1]+=1       # 次数加1
